坚持
  • 微信
当前位置:首页 > PYTHON >

函数

作者:管理员 时间:2026-06-06 阅读数: 750人阅读

一、函数概述

1. 函数作用

封装重复代码,实现代码复用、统一维护,一处修改全处生效。

2. 函数四类

  1. 内置函数len()、list()、int(),直接调用

  2. 标准库函数import导入模块后使用

  3. 第三方库函数:安装库后导入使用

  4. 自定义函数def自行定义(本章重点)

二、函数定义与调用

1. 语法格式

def 函数名(形参列表):
    """文档字符串:函数说明"""
    函数体
    return 返回值
  • def执行时创建函数对象,函数名引用该对象

  • return默认返回Nonereturn执行后立刻结束函数

  • 调用格式:函数名(实参),必须先定义再调用

#示例:三数求和
def add(a,b,c):
    """三个数字相加,返回和"""
    s = a+b+c
    return s
res = add(10,20,30)

2. 形参&实参

  • 形参:定义时括号内变量(a,b),仅声明,无实际值

  • 实参:调用传入的数据add(1,2,3),赋值给形参

3. 文档字符串

函数首行多行注释,用于说明功能、参数、返回值

def print_star(n):
    """根据n打印星号
    :param n: 星号数量
    :return: 星号字符串
    """
    return "*"*n

help(print_star)        #查看文档
print(print_star.__doc__)

4. 函数是对象

函数名本质是变量,指向堆中的函数对象,可赋值传递

def func():
    print("test")
f = func
f() #等价func()

三、变量作用域:全局/局部变量

1. 全局变量

函数外定义,整文件生效;函数内修改需global声明

a = 100
def f():
    global a
    a = 300
f()
print(a) #300

2. 局部变量

函数内部(含形参)定义,仅函数内可用;访问速度>全局变量
同名局部变量会屏蔽全局变量

a=100
def f():
    a=50 #局部变量
    print(a)
f()
print(a) #100
  • locals():查看当前局部变量字典

  • globals():查看全局变量字典

四、参数传递(全为引用传递)

Python传参都是对象地址引用,分可变、不可变两类

1. 可变对象(列表/字典/集合)

函数内修改原对象,外部同步变化

lst = [10,20]
def f(m):
    m.append(30)
f(lst)
print(lst) #[10,20,30]

2. 不可变对象(数字/字符串/元组)

内部重新赋值会生成新对象,不影响外部原值

n=100
def f(x):
    x +=200 #新建对象
f(n)
print(n) #100

特例:元组内含可变子元素,修改子元素原元组同步变

t = (10,20,[5,6])
def f(m):
    m[2][0]=999
f(t)
print(t) #(10,20,[999,6])

3. 浅拷贝&深拷贝(copy模块)

import copy
#浅拷贝copy:新容器,子对象共用引用
a=[10,20,[5,6]]
b=copy.copy(a)
b[2].append(7)
print(a) #[10,20,[5,6,7]]

#深拷贝deepcopy:容器+所有子对象全部新建
c=copy.deepcopy(a)
c[2].append(9)
print(a) #[10,20,[5,6,7]]
  • 浅拷贝:只复制外层容器,内层子对象共用地址

  • 深拷贝:递归拷贝所有层级,完全独立

五、五种参数类型

1. 位置参数

实参按顺序一一对应,个数必须匹配

def f(a,b,c):pass
f(1,2,3)

2. 默认值参数

形参设置默认,不传参则使用默认,必须放在位置参数后

def f(a,b,c=10):
    print(a,b,c)
f(1,2) #1 2 10
f(1,2,30) #1 2 30

3. 关键字(命名)参数

按参数名传参,顺序随意

def f(a,b,c):pass
f(b=2,a=1,c=3)

4. 可变参数

  • *args:接收多余位置参数,打包成元组

  • **kwargs:接收多余关键字参数,打包成字典

def f1(a,b,*args):
    print(a,b,args)
f1(1,2,3,4) #1 2 (3,4)

def f2(a,b,**kwargs):
    print(a,b,kwargs)
f2(1,2,name="张三") #1 2 {'name':'张三'}

def f3(a,b,*args,**kwargs):pass

5. 强制命名参数

*后面的形参,调用必须写关键字传参

def f(*a,b,c):pass
f(1,b=2,c=3)

六、lambda匿名函数

单行简易函数,格式:lambda 参数:表达式,表达式结果自动return

f = lambda a,b:a+b
print(f(2,3)) #5

#列表存储多个lambda
func_list = [lambda x:x*2,lambda x:x*3]
print(func_list[0](5)) #10

七、eval函数

字符串转表达式执行,有安全风险慎用

a=10;b=20
res = eval("a+b")
print(res) #30

八、递归函数

函数内部自己调用自己;必备两点:终止条件 + 递归公式

#阶乘n! = n*(n-1)!
def fact(n):
    if n==1:
        return 1
    return n*fact(n-1)
print(fact(5)) #120

缺点:大量创建函数对象,耗内存,大数据慎用

九、嵌套函数(内部函数)

函数里定义新函数,仅外层函数内可调用,用于代码封装、去重复

def outer():
    def inner():
        print("内部函数")
    inner()
outer()

nonlocal关键字

在内层函数修改外层局部变量(非全局),global修改全局变量

a=100
def outer():
    b=10
    def inner():
        nonlocal b
        global a
        b=20;a=1000
    inner()
    print(b) #20
outer()
print(a) #1000

十、LEGB变量查找顺序

查找变量优先级(从近到远)

  1. Local(当前函数局部) → 2.Enclosed(外层嵌套函数) →3.Global(全局) →4.Built-in(内置)

十一、作业完整代码

#1.反转整数 3245→5432
def reverse_num(n):
    s = str(n)
    return int(s[::-1])
print(reverse_num(3245))

#2.数列 m(n)=1/2+2/3+...+n/(n+1)
def calc(n):
    s=0
    for i in range(1,n+1):
        s += i/(i+1)
    return s

#3.毫秒转时分秒
def ms_trans(ms):
    s = ms//1000
    h = s//3600
    m = (s%3600)//60
    sec = s%60
    return h,m,sec

#4.三点求三角形面积(海伦公式)
def tri_area(x1,y1,x2,y2,x3,y3):
    import math
    a=math.hypot(x1-x2,y1-y2)
    b=math.hypot(x2-x3,y2-y3)
    c=math.hypot(x1-x3,y1-y3)
    if a+b>c and a+c>b and b+c>a:
        p=(a+b+c)/2
        area=math.sqrt(p*(p-a)*(p-b)*(p-c))
        return area
    else:
        return "坐标无效,无法构成三角形"

#5.海龟多点两两连线
import turtle
def draw_line(point_list):
    t = turtle.Turtle()
    for i in range(len(point_list)):
        for j in range(i+1,len(point_list)):
            t.penup()
            t.goto(point_list[i])
            t.pendown()
            t.goto(point_list[j])
    turtle.done()
#测试:draw_line([(0,0),(100,50),(200,-30)])


上一篇:

下一篇: